package com.example.oj_system.common;

import org.springframework.util.FileCopyUtils;
import org.springframework.util.StringUtils;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

/**
 *  封装相关进程操作
 */
public class CommandUtil {
    // 1. 通过 Runtime 类得到 Runtime 实例, 执行 exec 方法
    // 2. 获取到标准输出, 并写入到指定文件中.
    // 3. 获取到标准错误, 并写入到指定文件中.
    // 4. 等待子进程结束, 拿到子进程的状态码, 并返回.
    public static int run(String command, String stdoutFrom, String stderrFrom) {
        try {
            // 1. 通过 Runtime 类得到 Runtime 实例, 执行 exec 方法
            Process process = Runtime.getRuntime().exec(command);

            if (StringUtils.hasLength(stdoutFrom)) {
                // 2. 获取到标准输出, 并写入到指定文件中.
                InputStream stdOutFrom = process.getInputStream();
                FileOutputStream stdOutTo = new FileOutputStream(stdoutFrom, true); // 参数 true 可以实现追加复制
                // FileCopyUtils.copy 需要引入依赖
                FileCopyUtils.copy(stdOutFrom, stdOutTo);
                stdOutFrom.close();
                stdOutTo.close();
            }
            if (StringUtils.hasLength(stderrFrom)) {
                // 3. 获取到标准错误, 并写入到指定文件中.
                InputStream stdErrorFrom = process.getErrorStream();
                FileOutputStream stdErrorTo = new FileOutputStream(stderrFrom, true);
                // FileCopyUtils.copy 需要引入依赖
                FileCopyUtils.copy(stdErrorFrom, stdErrorTo);
                stdErrorFrom.close();
                stdErrorTo.close();
            }

            // 4. 等待子进程结束, 拿到子进程的状态码, 并返回.
            return process.waitFor();

        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }
        return 1;
    }
    
}
